1   package org.apache.maven.surefire.testng.conf;
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  import java.lang.reflect.Method;
23  import java.util.ArrayList;
24  import java.util.HashMap;
25  import java.util.Iterator;
26  import java.util.List;
27  import java.util.Map;
28  
29  import org.apache.maven.surefire.booter.ProviderParameterNames;
30  import org.apache.maven.surefire.testset.TestSetFailedException;
31  import org.testng.TestNG;
32  import org.testng.xml.XmlSuite;
33  
34  public abstract class AbstractDirectConfigurator
35      implements Configurator
36  {
37      final Map setters;
38  
39      AbstractDirectConfigurator()
40      {
41          Map options = new HashMap();
42          
43          
44          
45          options.put( "junit", new Setter( "setJUnit", Boolean.class ) );
46          options.put( ProviderParameterNames.THREADCOUNT_PROP, new Setter( "setThreadCount", int.class ) );
47          options.put( "usedefaultlisteners", new Setter( "setUseDefaultListeners", boolean.class ) );
48          this.setters = options;
49      }
50  
51      public void configure( TestNG testng, Map options )
52          throws TestSetFailedException
53      {
54          System.out.println( "\n\n\n\nCONFIGURING TESTNG\n\n\n\n" );
55          
56          final String listeners = (String) options.remove( "listener" );
57          
58          
59          testng.setUseDefaultListeners( false );
60          configureInstance( testng, options );
61          
62          testng.setListenerClasses( loadListenerClasses( listeners ) );
63      }
64  
65      public void configure( XmlSuite suite, Map options )
66          throws TestSetFailedException
67      {
68          Map filtered = filterForSuite( options );
69          configureInstance( suite, filtered );
70      }
71  
72  
73      protected Map filterForSuite( Map options )
74      {
75          Map result = new HashMap();
76          addPropIfNotNull( options, result, ProviderParameterNames.PARALLEL_PROP );
77          addPropIfNotNull( options, result, ProviderParameterNames.THREADCOUNT_PROP );
78          return result;
79      }
80  
81      private void addPropIfNotNull( Map options, Map result, String prop )
82      {
83          if ( options.containsKey( prop ) )
84          {
85              result.put( prop, options.get( prop ) );
86          }
87      }
88  
89      private void configureInstance( Object testngInstance, Map options )
90      {
91          for ( Iterator it = options.entrySet().iterator(); it.hasNext(); )
92          {
93              Map.Entry entry = (Map.Entry) it.next();
94              String key = (String) entry.getKey();
95              Object val = entry.getValue();
96  
97              Setter setter = (Setter) setters.get( key );
98              if ( setter != null )
99              {
100                 try
101                 {
102                     setter.invoke( testngInstance, val );
103                 }
104                 catch ( Exception ex )
105                 {
106                     throw new RuntimeException( "Cannot set option " + key + " with value " + val, ex );
107                 }
108 
109             }
110         }
111     }
112 
113     public static List loadListenerClasses( String listenerClasses )
114         throws TestSetFailedException
115     {
116         if ( listenerClasses == null || "".equals( listenerClasses.trim() ) )
117         {
118             return new ArrayList();
119         }
120 
121         List classes = new ArrayList();
122         String[] classNames = listenerClasses.split( "\\s*,\\s*(\\r?\\n)?\\s*" );
123         for ( int i = 0; i < classNames.length; i++ )
124         {
125             String className = classNames[i];
126             Class clazz = loadClass( className );
127             classes.add( clazz );
128         }
129 
130         return classes;
131     }
132 
133     public static Class loadClass( String className )
134         throws TestSetFailedException
135     {
136         try
137         {
138             return Class.forName( className );
139         }
140         catch ( Exception ex )
141         {
142             throw new TestSetFailedException( "Cannot find listener class " + className, ex );
143         }
144     }
145 
146     public static final class Setter
147     {
148         private final String setterName;
149 
150         private final Class paramClass;
151 
152         public Setter( String name, Class clazz )
153         {
154             this.setterName = name;
155             this.paramClass = clazz;
156         }
157 
158         public void invoke( Object target, Object value )
159             throws Exception
160         {
161             Method setter = target.getClass().getMethod( this.setterName, new Class[]{ this.paramClass } );
162             if ( setter != null )
163             {
164                 setter.invoke( target, new Object[]{ convertValue( value ) } );
165             }
166         }
167 
168         Object convertValue( Object value )
169         {
170             if ( value == null )
171             {
172                 return value;
173             }
174             if ( this.paramClass.isAssignableFrom( value.getClass() ) )
175             {
176                 return value;
177             }
178 
179             if ( Boolean.class.equals( this.paramClass ) || boolean.class.equals( this.paramClass ) )
180             {
181                 return Boolean.valueOf( value.toString() );
182             }
183             if ( Integer.class.equals( this.paramClass ) || int.class.equals( this.paramClass ) )
184             {
185                 return new Integer( value.toString() );
186             }
187 
188             return value;
189         }
190     }
191 }